# 1.导入需要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score


# 中文字体
plt.rcParams['font.sans-serif'] = 'SimHei'
# 负号
plt.rcParams['axes.unicode_minus'] = False

# 2.加载数据
# 使用scikit-learn库加载数据集lris
iris = load_iris()
# 把数据集为DataFrame
x = pd.DataFrame(iris.data, columns=iris.feature_names) # 特征数据
y = pd.Series(iris.target)  # 标签数据
# 显示前5行特征数据
print(x.head())

# 3.数据集的划分
# 把数据划分为训练集和测试集，通常是7:3的比例
# 我们把训练数据和测试数居分为80%和20%
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

# 4.特征缩放（标准化）
# 许多机器学习算法依赖于特征的尺度，特别是K最近邻算法。为了保证每个特征的均值为0，标准差为1，使用标准化来处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 5.选择模并训练
# 选择K近邻算法，并设置k=3
knn = KNeighborsClassifier(n_neighbors=3)
# 训练模型
knn.fit(X_train, y_train)

# 6.评估模型
# 预测测试集
y_pred = knn.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("准确率:", accuracy)

# 可视化结果
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred, cmap='viridis', marker='o')
plt.title('KNN分类结果')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.show()